package com.ocean;

import java.util.Iterator;
import java.util.regex.Pattern;
import java.util.List;
import java.util.ArrayList;

import com.ocean.util.LogUtil;

@SuppressWarnings({ "rawtypes", "unchecked" })
public class ParkObjValue extends ObjValue {
	/**
	 * 
	 */
	private static final long serialVersionUID = 5176256196698682646L;

	public ObjValue getNodeWidely(String nodekey) {
		ObjValue obj = new ObjValue();
		Object getobj = this.getObj(nodekey);
		if (getobj != null) {
			obj.put(nodekey, this.getObj(nodekey));
			for (Iterator iter = this.keySet().iterator(); iter.hasNext();) {
				String curkey = (String) iter.next();
				if (Pattern.matches(nodekey + "\\..*", curkey))
					obj.put(curkey, this.getObj(curkey));
			}
		}
		return obj;
	}

	public ObjValue getNode(String domain, String node) {
		ObjValue ov = new ObjValue();
		if (domain != null) {
			if (node != null) {
				String domainnodekey = getDomainnodekey(domain, node);
				Object obj = this.getObj(domainnodekey);
				Object version = this.getObj(ParkMeta.getYBB(domainnodekey));
				Object createby = this.getObj(ParkMeta.getYCJZ(domainnodekey));
				Object auth = this.getObj(ParkMeta.getYQX(domainnodekey));
				Object creatip = this.getObj(ParkMeta.getYCIP(domainnodekey));
				Object creattime = this.getObj(ParkMeta.getYCSJ(domainnodekey));
				Object prop = this.getObj(ParkMeta.getYSX(domainnodekey));
				Object updateby = this.getObj(ParkMeta.getYGXZ(domainnodekey));
				Object updateip = this.getObj(ParkMeta.getYGIP(domainnodekey));
				Object updatetime = this
						.getObj(ParkMeta.getYGSJ(domainnodekey));

				if (obj != null)
					ov.setObj(domainnodekey, obj);
				if (version != null)
					ov.setObj(ParkMeta.getYBB(domainnodekey), version);
				if (createby != null)
					ov.setObj(ParkMeta.getYCJZ(domainnodekey), createby);
				if (auth != null)
					ov.setObj(ParkMeta.getYQX(domainnodekey), auth);
				if (creatip != null)
					ov.setObj(ParkMeta.getYCIP(domainnodekey), creatip);
				if (creattime != null)
					ov.setObj(ParkMeta.getYCSJ(domainnodekey), creattime);
				if (prop != null)
					ov.setObj(ParkMeta.getYSX(domainnodekey), prop);
				if (updateby != null)
					ov.setObj(ParkMeta.getYGXZ(domainnodekey), updateby);
				if (updateip != null)
					ov.setObj(ParkMeta.getYGIP(domainnodekey), updateip);
				if (updatetime != null)
					ov.setObj(ParkMeta.getYGSJ(domainnodekey), updatetime);
			} else
				ov = getNodeWidely(domain);
		}
		return ov;
	}

	public ObjValue getParkInfo() {
		ParkObjValue obj = (ParkObjValue) this.clone();
		/*
		 * ArrayList<String> hbkeylist = new ArrayList<String>();
		 * 
		 * for(Iterator iter=obj.keySet().iterator();iter.hasNext();){ String
		 * curkey = (String)iter.next();
		 * if(curkey.indexOf(ParkMeta.getYSX())!=-1
		 * &&obj.get(curkey).equals(ParkMeta.getSXXT()))
		 * hbkeylist.add(curkey.substring
		 * (0,curkey.indexOf(ParkMeta.getYSX())));//creattime }
		 * 
		 * for(String hbkey:hbkeylist) obj.removeNodeWidely(hbkey);
		 */

		return obj;
	}

	public List<String[]> getParkInfoExp(long exp) {
		// System.out.println("exp:"+exp);
		ArrayList<String[]> keyexplist = new ArrayList<String[]>();

		for (Iterator iter = this.keySet().iterator(); iter.hasNext();) {
			String curkey = (String) iter.next();
			if (curkey.indexOf(ParkMeta.getYCSJ()) != -1) {
				String domainnodekey = curkey.substring(0,
						curkey.indexOf(ParkMeta.getYCSJ()));
				String[] keyarr = getDomainNode(domainnodekey);
				if (keyarr != null && keyarr.length == 2) {
					String propvalue = this.getString(ParkMeta
							.getYSX(domainnodekey));
					// System.out.println("propvalue:"+propvalue);
					if (propvalue == null
							|| !propvalue.equals(ParkMeta.getSXXT()))
						if (System.currentTimeMillis()
								- (Long) this.get(curkey) >= exp)
							keyexplist.add(keyarr);
				}
			}
		}
		// System.out.println("keyexplist:"+keyexplist);
		return keyexplist;
	}

	public ObjValue removeNodeWidely(String nodekey) {
		ObjValue obj = new ObjValue();
		Object node = this.remove(nodekey);

		if (node != null) {
			obj.put(nodekey, node);

			List<String> keylist = new ArrayList<String>();
			for (Iterator iter = this.keySet().iterator(); iter.hasNext();) {
				String curkey = (String) iter.next();
				if (Pattern.matches(nodekey + "\\..*", curkey))
					keylist.add(curkey);
			}

			for (String ck : keylist) {
				Object rvobj = this.remove(ck);
				if (rvobj != null)
					obj.put(ck, rvobj);
			}
		}

		return obj;
	}

	public ObjValue removeDomain(String domain) {
		ObjValue ov = new ObjValue();
		if (domain != null) {
			Object obj = this.remove(domain);
			Object version = this.remove(ParkMeta.getYBB(domain));
			Object createby = this.remove(ParkMeta.getYCJZ(domain));
			Object creatip = this.remove(ParkMeta.getYCIP(domain));
			Object creattime = this.remove(ParkMeta.getYCSJ(domain));

			if (obj != null)
				ov.setObj(domain, obj);
			if (version != null)
				ov.setObj(ParkMeta.getYBB(domain), version);
			if (createby != null)
				ov.setObj(ParkMeta.getYCJZ(domain), createby);
			if (creatip != null)
				ov.setObj(ParkMeta.getYCIP(domain), creatip);
			if (creattime != null)
				ov.setObj(ParkMeta.getYCSJ(domain), creattime);
		}
		return ov;
	}

	public ObjValue removeNode(String domain, String node) {
		ObjValue ov = new ObjValue();
		if (domain != null) {
			if (node != null) {
				String domainnodekey = getDomainnodekey(domain, node);
				Object obj = this.remove(domainnodekey);
				Object version = this.remove(ParkMeta.getYBB(domainnodekey));
				Object createby = this.remove(ParkMeta.getYCJZ(domainnodekey));
				Object auth = this.remove(ParkMeta.getYQX(domainnodekey));
				Object creatip = this.remove(ParkMeta.getYCIP(domainnodekey));
				Object creattime = this.remove(ParkMeta.getYCSJ(domainnodekey));
				Object prop = this.remove(ParkMeta.getYSX(domainnodekey));
				Object updateby = this.remove(ParkMeta.getYGXZ(domainnodekey));
				Object updateip = this.remove(ParkMeta.getYGIP(domainnodekey));
				Object updatetime = this
						.remove(ParkMeta.getYGSJ(domainnodekey));

				if (obj != null)
					ov.setObj(domainnodekey, obj);
				if (version != null)
					ov.setObj(ParkMeta.getYBB(domainnodekey), version);
				if (createby != null)
					ov.setObj(ParkMeta.getYCJZ(domainnodekey), createby);
				if (auth != null)
					ov.setObj(ParkMeta.getYQX(domainnodekey), auth);
				if (creatip != null)
					ov.setObj(ParkMeta.getYCIP(domainnodekey), creatip);
				if (creattime != null)
					ov.setObj(ParkMeta.getYCSJ(domainnodekey), creattime);
				if (prop != null)
					ov.setObj(ParkMeta.getYSX(domainnodekey), prop);
				if (updateby != null)
					ov.setObj(ParkMeta.getYGXZ(domainnodekey), updateby);
				if (updateip != null)
					ov.setObj(ParkMeta.getYGIP(domainnodekey), updateip);
				if (updatetime != null)
					ov.setObj(ParkMeta.getYGSJ(domainnodekey), updatetime);
			} else
				ov = removeNodeWidely(domain);
		}
		return ov;
	}

	public static boolean checkGrammar(String keyname) {
		if (keyname != null && Pattern.matches("^[a-z0-9A-Z_-]+$", keyname))
			return true;
		else {
			LogUtil.info("[KeyName]", "[error domain or node name]", keyname);
			return false;
		}
	}

	public static boolean checkGrammar(String domain, String node) {
		return checkGrammar(domain) && checkGrammar(node);
	}

	public static boolean checkGrammar(String domain, String node, Object obj) {
		if (obj == null)
			LogUtil.info("[checkGrammar]", "[error]", obj);
		return checkGrammar(domain, node) && obj != null;
	}

	public static String getDomainnodekey(String domain, String node) {
		String domainnodekey = node == null ? domain : domain + "." + node;
		return domainnodekey;
	}

	public static String[] getDomainNode(String domainnodekey) {
		// String[] keyarr = domainnodekey.split("\\.");
		// System.out.println("getDomainNode domainnodekey:"+domainnodekey);
		return domainnodekey.split("\\.");
	}

	public static void main(String[] args) {
		// String[] keyarr = getDomainNode("aaa.bbb");
		// System.out.println("getDomainNode keyarr.length:"+keyarr.length);
		ParkObjValue ob = new ParkObjValue();
		ParkObjValue.checkGrammar("d", "a.b");
		// System.out.println(Pattern.matches("^[a-z0-9A-Z_-]+$", " d "));
		ob.setString("a" + ParkMeta.getYBB(), "0");
		ob.setString("a.b" + ParkMeta.getYBB(), "0");
		ob.setString("a.c" + ParkMeta.getYBB(), "0");
		System.out.println(ob.getWidely(ParkMeta.getYBB("a" + "\\..+")));
	}
}